iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Odoo

利用【AI】工具,聰明進行 Odoo 程式開發系列 第 27

Day27:個案二:投資管理系統(7)-股票觀察清單,透過機器學習預測股市漲跌

  • 分享至 

  • xImage
  •  

使用者故事

8. **作為一名投資者,我希望能查看觀察名單中股票的預測走勢,以便更快速地做出投資決策。**

加入 web 參考

@Web @https://github.com/HowardNTUST/Marketing-Data-Science-Application?tab=readme-ov-file
請參考
透過機器學習預測股市漲跌 - 基本資料處理(附Python程式碼)
透過機器學習預測股市漲跌 - 進階資料處理(附Python程式碼)
透過機器學習預測股市漲跌-模型建模(附Python程式碼)
透過機器學習預測股市漲跌 - 模型投資策略驗證(附Python程式碼)

Cursor 相關回應

  1. 基本資料處理

    • 從 Yahoo Finance API 或其他可靠的數據源獲取歷史股價數據
    • 處理缺失值和異常值
    • 計算技術指標,如移動平均線、相對強弱指標(RSI)、MACD等
    • 生成目標變量(例如:未來5天是否上漲)
  2. 進階資料處理

    • 特徵工程:創建新的特徵,如價格變化率、成交量變化率等
    • 特徵選擇:使用相關性分析或其他方法選擇最相關的特徵
    • 資料標準化:對特徵進行標準化處理
    • 資料分割:將數據集分為訓練集和測試集
  3. 模型建模

    • 選擇合適的機器學習算法,如隨機森林、支持向量機(SVM)或深度學習模型
    • 使用訓練集訓練模型
    • 在測試集上評估模型性能
    • 使用交叉驗證優化模型參數
  4. 投資策略驗證

    • 根據模型預測結果制定簡單的買入/賣出策略
    • 在歷史數據上回測策略
    • 計算策略的收益率、夏普比率等指標
    • 與買入並持有策略進行比較
  5. 整合到現有系統

    • 創建新的模型 stock.prediction 來存儲預測結果
    • stock.watchlist 模型中添加預測相關的字段
    • 設計定時任務,定期更新預測結果
    • 在用戶界面中展示預測結果和建議
  6. 用戶界面設計

    • 在觀察名單視圖中添加預測結果列
    • 創建預測詳情頁面,顯示預測依據和置信度

重要程式碼生成及測試

這段程式碼的重點是建立一個股票預測系統,基於技術指標訓練機器學習模型,並對未來價格變化進行預測。以下是程式碼的核心思路和邏輯重點:

1. 模型數據結構

class StockPrediction(models.Model):
    _name = 'stock.prediction'
    _description = '股票預測模型'

這個模型 StockPrediction 是用來儲存股票預測的數據。其主要欄位包括:

  • watchlist_id: 關聯到股票觀察名單,用來指定需要預測的股票數據來源。
  • model: 儲存經過訓練的機器學習模型,以二進位格式存放(使用 pickle 序列化)。
  • last_trained: 儲存模型最後訓練的時間,以便追蹤模型的更新狀態。

2. 準備資料

def prepare_data(self):
    kline_data = self.env['stock.kline'].search([('watchlist_id', '=', self.watchlist_id.id)], order='date asc')
    # 資料整理並構建DataFrame
    df = pd.DataFrame({
        'date': kline_data.mapped('date'),
        'open': kline_data.mapped('open_price'),
        'high': kline_data.mapped('high_price'),
        'low': kline_data.mapped('low_price'),
        'close': kline_data.mapped('close_price'),
        'volume': kline_data.mapped('volume')
    })

    # 計算額外的技術指標和目標變量
    df['returns'] = df['close'].pct_change()  # 日內收益率
    df['target'] = np.where(df['returns'].shift(-1) > 0, 1, 0)  # 預測次日上漲(1)或下跌(0)

    # 計算技術指標
    df['sma5'] = df['close'].rolling(window=5).mean()
    df['sma20'] = df['close'].rolling(window=20).mean()
    df['rsi'] = self.calculate_rsi(df['close'])  # 計算 RSI 指標

    df = df.dropna()  # 刪除含有空值的行

    # 特徵集和標籤
    features = ['open', 'high', 'low', 'close', 'volume', 'sma5', 'sma20', 'rsi']
    X = df[features]
    y = df['target']

    return X, y

這裡的資料準備過程主要是從 stock.kline 中提取 K 線數據,並且計算技術指標(如簡單移動平均線 SMA 和相對強弱指數 RSI)。生成特徵集 X 和目標變量 y,作為後續模型訓練的數據輸入。

  • returns: 計算每一天的收益率,用來判斷價格變動方向。
  • target: 設定目標變量,預測明天價格上升(1)或下降(0)。
  • 技術指標 sma5, sma20, rsi 是用來增強模型的預測能力。

3. RSI 計算

def calculate_rsi(self, prices, period=14):
    delta = prices.diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))

這個方法用來計算 RSI(相對強弱指數),該指標用來判斷股票是否處於超買或超賣狀態。

4. 訓練模型

def train_model(self):
    X, y = self.prepare_data()  # 準備數據
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 訓練/測試集劃分

    model = RandomForestClassifier(n_estimators=100, random_state=42)  # 使用隨機森林分類器
    model.fit(X_train, y_train)  # 訓練模型

    y_pred = model.predict(X_test)  # 預測測試集
    accuracy = accuracy_score(y_test, y_pred)  # 計算準確度

    self.model = pickle.dumps(model)  # 序列化模型並儲存
    self.last_trained = fields.Datetime.now()  # 更新最後訓練時間

    return accuracy

此方法用來訓練隨機森林模型。使用 train_test_split 方法將資料分為訓練集和測試集,並使用隨機森林分類器進行模型訓練。訓練完成後,模型會被序列化並儲存起來。此方法還會返回模型的準確度。

5. 預測未來走勢

def make_prediction(self):
    if not self.model:
        return None, 0

    model = pickle.loads(self.model)  # 反序列化已保存的模型
    latest_data = self.prepare_data()[0].iloc[-1].values.reshape(1, -1)  # 使用最新的數據進行預測
    prediction = model.predict(latest_data)[0]  # 進行預測
    confidence = model.predict_proba(latest_data)[0][prediction]  # 預測的置信度

    return prediction, confidence

該方法會使用已訓練好的模型對最新的數據進行預測。首先反序列化模型,然後使用最新的特徵數據進行預測,並返回預測結果和置信度。

https://ithelp.ithome.com.tw/upload/images/20241010/20102255AWcKnlItog.jpg

本章小節

這段使用者故事中的需求,是讓投資者能查看觀察名單中股票的預測走勢,以幫助他們快速作出投資決策。結合你提供的 Cursor 工具及 web 參考,整個開發流程可進行以下增強:

1. 基本資料處理

  • stock.kline 提取 K 線數據,並計算移動平均線、RSI 等技術指標。這部分和你的代碼邏輯吻合,已涵蓋準備資料和計算技術指標的需求。

2. 進階資料處理

  • 特徵工程:如引入更多技術指標(如 MACD、成交量變化率等),這能進一步提高模型的預測能力。
  • 特徵選擇:可以通過相關性分析來選擇對價格影響較大的特徵,讓模型更專注於重要變量。
  • 資料標準化:在一些機器學習算法中,對特徵進行標準化處理可能會有助於模型的表現。

3. 模型建模

  • 現在你使用的是隨機森林模型,這是很好的起點。根據需求,你也可以嘗試其他機器學習模型,例如支持向量機(SVM)或深度學習模型來比較它們的表現。

4. 投資策略驗證

  • 你可以根據模型預測結果構建買入/賣出的簡單投資策略,並進行回測來檢查其歷史表現(如收益率、風險等)。這部分可幫助你驗證模型的實用性,確保其在真實環境中的效果。

5. Cursor 和 Web 參考運用

  • Cursor Composer 可以快速生成程式碼,並且根據參考資料進行自動化調整,如透過引用 @web 資源來整合外部知識,提升程式碼的開發效率。
  • @web 參考如 "透過機器學習預測股市漲跌" 等資源,能讓開發者從資料處理到模型建模的各個階段進行補充和調整,達到快速迭代的效果。

總體說明:

  • 資料準備與技術指標計算:充分利用 K 線數據、移動平均線和 RSI 等技術指標。
  • 模型訓練與預測:使用隨機森林或其他模型進行訓練,並對未來股市走勢進行預測。
  • UI 整合與系統優化:在系統界面中提供股票預測結果,並實現定期更新與自動化預測功能。
  • 工具整合與資源運用:透過 @web 資源來快速產生、測試和優化程式碼,借助 Cursor 來提高開發效率。

這樣的流程確保了投資者可以輕鬆查看預測結果,進而做出更快速的投資決策。

相關程式碼

https://github.com/kulius/odoo17_ithelp/tree/master/addons/personal_stock

上一篇
Day26:個案二:投資管理系統(6)-產生股票觀察清單,買入賣出建議
下一篇
Day28:個案二:投資管理系統(8)-股票觀察清單,透LINE發送提醒通知
系列文
利用【AI】工具,聰明進行 Odoo 程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言